// 定义经纬度类型
export type LngLat = [number, number];

/**
 * AMap模块接口-  适用于调取drawPolylines绘制多条轨迹方法的返回值
 * @property name - 模块名称： 'Polyline'
 * @property instance - 折线实例数组
 * @property events - 事件处理对象
 */
export interface PolylineModule {
  name: string;
  instance: PolylineInstance[];
  events: {
    remove: () => void;
    closeInfoWindow: () => void;
  };
}

/**
 * 折线实例接口- 适用于调取createSinglePolyline绘制单条轨迹的返回值
 * @property polyline - AMap折线实例
 * @property passedPolyline - 已通过路径的折线实例
 * @property marker - 标记点实例
 * @property methods - 折线控制方法
 * @property eventListeners - 事件监听器对象
 */
export interface PolylineInstance {
  polyline: any;
  passedPolyline: any;
  marker: any;
  methods: PolylineMethods | null;
  eventListeners: {
    percentChange: ((percent: number, index: number) => void)[];
  };
  on(eventName: string, callback: (percent: number, index: number) => void): void;
  off(eventName: string, callback: (percent: number, index: number) => void): void;
}

/**
 * 折线动画控制方法接口
 * 提供对折线动画的完整生命周期控制
 */
export interface PolylineMethods {
  /** 开始动画 */
  start: AnimationEvent;
  /** 暂停动画 */
  pause: () => void;
  /** 恢复动画 */
  resume: AnimationEvent;
  /** 停止动画并重置状态 */
  stop: () => void;
}

/**
 * 动画事件处理函数类型
 * 用于定义开始和恢复动画的方法签名
 * @param duration 动画持续时间(毫秒)，默认1000ms
 * @param opts 动画配置选项
 * @param cb 动画完成回调函数
 */
export type AnimationEvent = (duration?: number, opts?: MoveAnimationOptions, cb?: () => void) => void;

/**
 * 移动动画配置选项
 * 用于自定义折线动画的行为和效果
 */
export type MoveAnimationOptions = {
  /**
   * 动画持续时间(毫秒)或动态计算函数
   * @default 1000
   */
  duration?: number | AnimationCallback;

  /**
   * 缓动函数，控制动画速度变化
   * @default 'linear'
   */
  easing?: number | EasingCallback;

  /**
   * 是否循环播放动画
   * @default false
   */
  circlable?: boolean;

  /**
   * 动画延迟开始时间(毫秒)或动态计算函数
   * @default 0
   */
  delay?: number | AnimationCallback;

  /**
   * 动画帧间隔时间(毫秒)
   * 控制动画刷新频率，值越小动画越流畅
   * @default 16
   */
  aniInterval?: number;

  /**
   * 是否自动旋转标记方向以匹配移动方向
   * @default false
   */
  autoRotation?: boolean;
};

/**
 * 动画回调函数类型
 * 用于动态计算动画属性值
 * @param index 当前运行到的路径点索引
 * @param data 当前路径点的经纬度坐标
 * @returns 计算后的属性值(如延迟时间或持续时间)
 */
export type AnimationCallback = (index: number, data: LngLat) => number;

/**
 * 缓动函数类型
 * 控制动画的速度变化曲线
 * @param passedTime 已过去的时间占总时间的比例(0-1)
 * @returns 缓动后的值(0-1)
 * @example
 * // 线性缓动(无变化)
 * (t) => t
 * // 缓入缓出
 * (t) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2
 */
export type EasingCallback = (passedTime: number) => number;

/**
 * 折线模块参数选项接口
 * 定义创建折线时所需的配置参数
 * @interface PolylineOptions
 * @property {LngLat[]} path - 折线路径坐标数组，格式为[经度, 纬度][]，必选参数
 * @property {number} [zIndex=0] - 折线的图层顺序，值越大显示越在上方，默认为0
 * @property {boolean} [bubble=false] - 是否允许事件冒泡到地图容器，默认为false
 * @property {string} [cursor='pointer'] - 鼠标悬停在折线上时的光标样式，默认为'pointer'
 * @property {string} [strokeColor='#0066FF'] - 线条颜色，支持十六进制、RGB等格式，默认为'#0066FF'
 * @property {number} [strokeOpacity=1] - 线条透明度，取值范围为0-1，默认为1
 * @property {number} [strokeWeight=2] - 线条宽度，单位为像素，默认为2
 * @property {number} [height=0] - 3D视图下的折线高度，单位为米，默认为0
 * @property {boolean} [showDir=false] - 是否显示折线方向箭头，默认为false
 * @property {object} [extData=null] - 存储额外信息的对象，可用于传递自定义数据
 * @property {any} [key: string] - 其他可选属性，支持高德地图API提供的任何折线配置项
 */
export interface PolylineOptions {
  path: LngLat[];
  zIndex?: number;
  bubble?: boolean;
  cursor?: string;
  strokeColor?: string;
  strokeOpacity?: number;
  strokeWeight?: number;
  height?: number;
  showDir?: boolean;
  extData?: {
    origin?: any;
    [key: string]: any;
  };
  [key: string]: any;
}

// 定义额外参数接口
export interface ExtraOptions {
  // 是否开启坐标转换，默认不转换'', 高德地图使用的是 GCJ-02 坐标，可选值:'wgs84ToGcj02'\| 'gcj02ToWgs84'\| 'gcj02ToBd09'\| 'batchGcj02ToBd09'\| 'bd09ToGcj02'\| 'batchBd09ToGcj02'
  coordTransform?: string;
  // 是否开启显示停留点, 适用于Polyline模块 默认不创建 -
  isStopovers?: boolean;
  // 是否标注走过的点位, 适用于Polyline模块 默认不标注 -
  isLabeled?: boolean;
  /** 电子围栏配置 */
  isFence?: {
    /** 是否开启电子围栏 */
    isOn?: boolean;
    fences: {
      /** 电子围栏文本说明 */
      text?: string;
      /** 电子围栏文本样式 */
      textStyle?: object;
      /** 电子围栏中心坐标 */
      center?: LngLat;
      /** 电子围栏半径，单位为米 */
      radius?: number;
      /** 电子围栏层级，默认10 */
      zIndex?: number;
      /** 指定鼠标悬停时的鼠标样式 */
      cursor?: string;
      /** 轮廓线颜色 */
      strokeColor?: string;
      /** 轮廓线透明度 */
      strokeOpacity?: number;
      /** 轮廓线宽度 */
      strokeWeight?: number;
      /** 轮廓线样式 */
      strokeStyle?: "solid" | "dashed";
      /** 轮廓线虚线样式 */
      strokeDasharray?: number[];
      /** 填充颜色 */
      fillColor?: string;
      /** 填充透明度 */
      fillOpacity?: number;
      [key: string]: any;
    }[];
  };
  // 是否禁用标注点位的infoWindow信息弹窗, 适用于Polyline模块 默认: 不禁用
  relieveInfoWindow?: boolean;
  // 停留点坐标数组，格式为[经度, 纬度][]
  stopovers?: LngLat[];
  /**
   * 折线图标配置接口
   * 定义折线相关的各种图标类型及其属性
   */
  icon?: {
    /** 起点图标 - 表示折线的起始位置 */
    StartPoint?: PointIcon;

    /** 终点图标 - 表示折线的结束位置 */
    EndPoint?: PointIcon;

    /** 行驶中图标 - 表示移动中的点（如车辆、行人等） */
    Driving?: PointIcon;

    /** 停留点图标 - 表示路线中的停留位置 */
    StopoverPoint?: PointIcon;

    /** 鼠标移入路径点时当前Marker点的图标 - 表示路线中的普通点位 */
    PointSvg?: PointIcon;

    /** 路径点显示的图标 - 表示路线中的普通点位 */
    PointPng?: PointPng;
  };
}

export interface PointPng {
  url: string; // 必填参数,图标的地址
  size: [number, number]; // 必填参数
  anchor: [number, number]; // 必填参数 ,偏移
  zIndex: number; // 必填参数 层级， 默认4
  rotation?: number; // 旋转角度
}

export interface PointIcon {
  icon?: string | ICON;
  content?: string | HTMLElement;
  offset?: [number, number]; // 偏移
  zIndex?: number; // 层级， 默认4
}

export interface ICON {
  size?: [number, number]; // 图标尺寸，默认值(36,36)
  imageOffset?: [number, number]; // 图标取图偏移量
  image?: string; // 图标的取图地址
  imageSize?: [number, number];
}

// 标注点位类型
export interface LabeledPosition {
  lnglat: LngLat;
  content: any;
  index: number; // 保存原始索引用于区域分组
}
